package com.example.mapper;

import com.example.entity.SysUser;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

public interface UserMapper{

    @ResultMap("sysUserResultMap")
    @Select("select * from sys_user where id=#{id}")
    SysUser selectById(Long id);

    // Mapper接口允许方法重载，但是有一些限制：
    // 1.接口里的方法可以重载，但是 Mybatis 的 Mapper.xml 里面的 id 不允许重复。
    // 2.如果两个重载的方法都有参数，那么Mapper.xml中使用到的参数必须在这两个重载方法中都存在
    // 一个有参方法和一个无参方法这种倒是不碍事，估计是当方法是无参方法的时候，不去计算OGNL表达式
    // （本例中的select(@Param("id") Long id)和select(@Param("id")Long id, @Param("name") String name)就不满足上面的第2个条件，
    // 导致执行select(@Param("id") Long id)的时候会抛异常：BindingException: Parameter 'name' not found. Available parameters are [id, param1]
    // 因为使用OGNL计算<if test="id != null and name != null">标签中的表达式的时候，由于name这个参数不存在，导致无法判断name是否为null（这个挺操蛋的）

    List<SysUser> select();

    // 测试【方法重载】
    List<SysUser> select(@Param("id") Long id);

    List<SysUser> select(@Param("id")Long id, @Param("name") String name);

    // 通过Id或者用户名查找
    SysUser selectByIdOrUserName(SysUser sysUser);

    // 根据动态条件查询用户信息
    List<SysUser> selectByUser(SysUser sysUser);

    // 根据用户id集合查询
    List<SysUser> selectByIdList(List<Long> idList);

    // 根据用户id集合查询
    List<SysUser> selectByIdArray(Long[] idList);

    // 根据用户id集合查询
    // key: idList
    // values: [id1, id2, ...]
    List<SysUser> selectByIdMap(Map<String, Object> map);

    // 根据主键更新

    // 根据key1=value1 and key2=value2 ...进行查询
    // key: 列名
    // value: 列的值
    //List<SysUser> selectByMap(Map<String, Object> map);
    List<SysUser> selectByMap(@Param("paramMap") Map<String, Object> map);



    int updateByIdSelective(SysUser sysUser) ;

    // 通过map更新列
    int updateByMap(Map<String, Object> map);

    // 插入
    int insert(SysUser sysUser);

    // 批量插入用户
    int insertList(List<SysUser> userList);
}
